
section	.text

extern __idt_desc

global __load_idt
__load_idt:
	lidt	[__idt_desc]
	ret
	
extern __isr_handle

global __idt_0
global __idt_1
global __idt_2
global __idt_3
global __idt_4
global __idt_5
global __idt_6
global __idt_7
global __idt_8
global __idt_9
global __idt_10
global __idt_11
global __idt_12
global __idt_13
global __idt_14
global __idt_15
global __idt_16
global __idt_17
global __idt_18
global __idt_19
global __idt_20
global __idt_21
global __idt_22
global __idt_23
global __idt_24
global __idt_25
global __idt_26
global __idt_27
global __idt_28
global __idt_29
global __idt_30
global __idt_31

__idt_0:
	cli
	push	dword 0
	push	dword 0
	jmp	__idt_common_handler

__idt_1:
	cli
	push	dword 0
	push	dword 1
	jmp	__idt_common_handler

__idt_2:
	cli
	push	dword 0
	push	dword 2
	jmp	__idt_common_handler

__idt_3:
	cli
	push	dword 0
	push	dword 3
	jmp	__idt_common_handler

__idt_4:
	cli
	push	dword 0
	push	dword 4
	jmp	__idt_common_handler

__idt_5:
	cli
	push	dword 0
	push	dword 5
	jmp	__idt_common_handler
	

__idt_6:
	cli
	push	dword 0
	push	dword 6
	jmp	__idt_common_handler
	
__idt_7:
	cli
	push	dword 0
	push	dword 7
	jmp	__idt_common_handler
	
__idt_8:
	cli
	push	dword 8
	jmp	__idt_common_handler
	
__idt_9:
	cli
	push	dword 0
	push	dword 9
	jmp	__idt_common_handler
	
__idt_10:
	cli
	push	dword 10
	jmp	__idt_common_handler
	
__idt_11:
	cli
	push	dword 11
	jmp	__idt_common_handler
	
__idt_12:
	cli
	push	dword 12
	jmp	__idt_common_handler
	
__idt_13:
	cli
	push	dword 13
	jmp	__idt_common_handler
	
__idt_14:
	cli
	push	dword 14
	jmp	__idt_common_handler
	
__idt_15:
	cli
	push	dword 0
	push	dword 15
	jmp	__idt_common_handler
	
__idt_16:
	cli
	push	dword 0
	push	dword 16
	jmp	__idt_common_handler
	
__idt_17:
	cli
	push	dword 0
	push	dword 17
	jmp	__idt_common_handler
	
__idt_18:
	cli
	push	dword 0
	push	dword 18
	jmp	__idt_common_handler
	
__idt_19:
	cli
	push	dword 0
	push	dword 19
	jmp	__idt_common_handler
	
__idt_20:
	cli
	push	dword 0
	push	dword 20
	jmp	__idt_common_handler
	
__idt_21:
	cli
	push	dword 0
	push	dword 21
	jmp	__idt_common_handler
	
__idt_22:
	cli
	push	dword 0
	push	dword 22
	jmp	__idt_common_handler
	
__idt_23:
	cli
	push	dword 0
	push	dword 23
	jmp	__idt_common_handler
	
__idt_24:
	cli
	push	dword 0
	push	dword 24
	jmp	__idt_common_handler
	
__idt_25:
	cli
	push	dword 0
	push	dword 25
	jmp	__idt_common_handler
	
__idt_26:
	cli
	push	dword 0
	push	dword 26
	jmp	__idt_common_handler
	
__idt_27:
	cli
	push	dword 0
	push	dword 27
	jmp	__idt_common_handler
	
__idt_28:
	cli
	push	dword 0
	push	dword 28
	jmp	__idt_common_handler
	
__idt_29:
	cli
	push	dword 0
	push	dword 29
	jmp	__idt_common_handler
	
__idt_30:
	cli
	push	dword 0
	push	dword 30
	jmp	__idt_common_handler
	
__idt_31:
	cli
	push	dword 0
	push	dword 31
	jmp	__idt_common_handler
	

	
__idt_common_handler:
	pusha
	push	ds
	push	es
	push	fs
	push	gs
	push	ss
	mov	ax,	0x10
	mov	ds,	ax
	mov	es,	ax
	mov	fs,	ax
	mov	gs,	ax
	mov	ss,	ax
	mov	eax,	esp
	push	eax
	call	__idt_entry
	pop	eax
	pop	ss
	pop	gs
	pop	fs
	pop	es
	pop	ds
	popa
	add	esp,	8
	iret
	

	;;
	;; This can clobber registers because their state is stored
	;; by __idt_common_handler
	;; 
__idt_entry:
	push	ebp
	mov	ebp,	esp
	mov	eax,	[ebp + 64]
	mov	ebx,	[ebp + 68]
	push	ebx
	push	eax
	call	__isr_handle
	pop	eax
	pop	ebx
	pop	ebp
	ret
